package pruebas;

import principal.Constantes;
import basicas.Posicion;
import juego.AlgoTank;
import juego.Tanque;
import juego.enums.tipoMovimiento;
import junit.framework.TestCase;
import niveles.Tablero;

public class TableroTest extends TestCase {
	Tablero unTablero; 
	Posicion unaPosicion;
	Posicion posicionInvalida;
	Posicion posicionInvalidaDireccion;
	Tanque  unTanque;
	tipoMovimiento movimiento;
 
	
	public void setUp(){
		unTablero= new Tablero();
		unaPosicion=new Posicion(3,2);
	    posicionInvalida= new Posicion(20,20);
		posicionInvalidaDireccion= new Posicion(0,0);
	    unTanque =	new AlgoTank(unaPosicion);
	}
	
	public void testInicializacion(){
		assertNotNull(unTablero);
	}
	
	/*
	verifica que la posicion este dentro de los limite del tablero
	*/
	public void testDentroLimites() {	 
		 assertFalse (unTablero.dentroLimites(20,6));
		 assertTrue (unTablero.dentroLimites(6,6));	
	}

	/*
	 * verifica que un objeto se pueda mover en una direccion
	 */
	public void testSePuedeMover() {
		//posicion valida
		assertTrue(unTablero.sePuedeMover(unTanque, tipoMovimiento.arriba));
		//pasa una posicion no valida al tanque
		unTanque = new AlgoTank(posicionInvalida);
		assertFalse(unTablero.sePuedeMover(unTanque, tipoMovimiento.arriba));
		
		//paso una posicion en la que no se pueda mover para arriba
		unTanque = new AlgoTank(posicionInvalidaDireccion);
		assertFalse(unTablero.sePuedeMover(unTanque, tipoMovimiento.arriba));	
	}

	public void testReservarPosicion() {	
	  	unTanque = new AlgoTank(unaPosicion); 
		unTanque.setDireccion(movimiento.abajo);
		//verifico que el casillero donde quiero ubicar el tanque este vacio
		assertTrue(unTablero.casillero(3, 3) == Constantes.VALOR_CASILLERO_LIBRE);
		
		//verifico que el tanque no se pueda ubicar en una ubicacion reservada
		unTablero.reservarPosicion(unTanque); 
		assertFalse(unTablero.casillero(3, 3) == Constantes.VALOR_CASILLERO_LIBRE);
	    
		//posiciono el tanque en una posicion invalida
		unTanque = new AlgoTank(posicionInvalida);
	    unTablero.reservarPosicion(unTanque);
		assertFalse(unTablero.casillero(3, 3) == Constantes.VALOR_CASILLERO_LIBRE);
	}

    public void testOcuparPosicion(){
		unTanque = new AlgoTank(unaPosicion);
		//verifico que no este ocupada la posicion
		assertTrue(unTablero.casillero(3,2) == Constantes.VALOR_CASILLERO_LIBRE);
		//incerto un objeto en la posicion , luego verifico que la posicion este ocupada   
		unTablero.ocuparPosicion(unTanque);
		assertFalse(unTablero.casillero(3,2) == Constantes.VALOR_CASILLERO_LIBRE);
    }
}

